在线地图显示 (在线矢量地图)Sample (在线瓦片地图)Sample (天地图)Sample (百度地图)Sample (高德地图)Sample (Google地图)Sample (OSM地图)Sample

最后更新时间:2019年7月4日

在线地图显示方法

MapGIS移动端支持的在线地图数据类型包括:MapGIS的在线矢量、瓦片地图服务,基于OGC标准的地图服务(WMS、WMTS),以及第三方在线地图服务(天地图、Google地图、OSM地图、百度地图、高德地图、Bing地图等)。

在线地图数据来源众多,但显示方法原理相同,方法类似,在线地图的加载方法可以归纳为以下的两种,所有在线地图都可以通过这两种方式加载显示。

方法 接口 地图类型 使用场景
服务图层方式 setMapAsync 所有在线地图 不需配置地图文档
地图文档方式 loadFromFileAsync / loadFromDocumentAsync 所有在线地图 需要配置地图文档

一、服务图层方式

通过地图服务URL地址构造MGSServerLayer服务图层,从而构建MGSMap,然后调用setMap / setMapAsync方法加载。此方法经常采用于图层数量少的情况下,简单便捷,不需配置地图文档。接下来以MapGIS IGServer在线矢量地图服务为例展示实现过程。

//定义地图视图、地图
@property (weak, nonatomic) IBOutlet MGSMapView *mapView;
@property (nonatomic,strong) MGSMap *map;

//地图服务,igserver矢量地图服务类型为MAPSERVER_TYPE_IGSERVER_VECTOR
MGSMapServer* mapServer = [MGSServerLayer createMapServerByType:MAPSERVER_TYPE_IGSERVER_VECTOR];
[mapServer setName:@"IGServer服务图层"];
[mapServer setUrl:@"http://develop.smaryun.com:6163/igs/rest/mrms/docs/WorldJWVector"];

//创建服务图层
MGSServerLayer *serverLayer=[[MGSServerLayer alloc] init];
[serverLayer setMapServer:mapServer];

//创建地图
if (_map == nil) {
    _map=[[MGSMap alloc] init];
}
//给地图添加服务图层
[_map append:serverLayer];

//为地图容器设置地图
[_mapView setMapAsync:_map callback:^(BOOL success) {
    if (success) {
        //地图加载成功
    } else {
        //地图加载失败
    }
}];

所有在线地图加载使用的方法都一样,区别只是在构建MapServer地图服务对象时选择的服务类型的不同。MapGIS Mobile提供诸多类型的地图服务,例如MapGIS地图服务、OGC服务、天地图、Google地图服务、百度地图、高德地图等等,其地图服务类型对应的接口由MGSMapServer类提供,关键的地图服务类型如下表所示:

数据来源 数据类型 地图服务类型
在线 IGServer矢量地图服务 MAPSERVER_TYPE_IGSERVER_VECTOR
IGServer瓦片地图服务 MAPSERVER_TYPE_IGSERVER_TILE
WMS服务 MAPSERVER_TYPE_OGC_WMS
WMTS服务 MAPSERVER_TYPE_OGC_WMTS
天地图服务 MAPSERVER_TYPE_TIANDITU
谷歌地图服务 MAPSERVER_TYPE_GOOGLE_MAP
百度地图服务 MAPSERVER_TYPE_BAIDU_MAP
OSM地图服务 MAPSERVER_TYPE_OPENSTREET_STANDARD
Bing地图服务 MAPSERVER_TYPE_BING_MAP
离线 瓦片地图 MAPSERVER_TYPE_TDF

为方便用户使用公共地图服务,除了MapGIS IGServer地图服务、天地图系列的服务、OGC标准的WMS / WMTS服务,其他所有地图服务在接口内部已经设置好服务地址,不需用户调用setUrl方法自己设置。

重点说明:根据天地图的要求,使用天地图提供的地图服务,需要申请key,对此MapGIS Mobile对接了此要求,调用方法稍有不同,区别在于构建MGSMapServer时还需设置认证信息,如下所示:

//创建地图服务,并设置名称、URL地址
MGSMapServer* mapServer = [MGSServerLayer createMapServerByType:MAPSERVER_TYPE_TIANDITU];
[mapServer setName:@"天地图服务"];
//设置URL:矢量底图
[mapServer setUrl:@"http://t0.tianditu.gov.cn/vec_c/wmts"];
//设置认证信息
[mapServer setAuthenticationWithUser:@"tk" pwd:@"用户申请的key"];

//服务图层
MGSServerLayer *serverLayer=[[MGSServerLayer alloc] init];
[serverLayer1 setMapServer:mapServer];

说明:setAuthenticationWithUser: pwd:方法中pwd的值即key值,需要用户根据自己的应用申请,申请地址为天地图官网

二、地图文档方式

将在线地图服务URL组织为mapx地图文档之后,可调用loadFromFileAsync或loadFromDocumentAsync方法进行加载。

1、loadFromFileAsync方法

//定义地图视图控件对象
@property (weak, nonatomic) IBOutlet MGSMapView *mapView;

//在线地图文档路径
NSString *onlineMapPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx"];

//异步方式加载地图
[_mapView loadFromFileAsync:onlineMapPath];
//设置地图代理
[_mapView setDelegate:self];

地图加载回调函数:

//开始加载地图监听
-(void)willStartLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{
    NSLog(@"开始加载地图");
}

//加载地图完成事件监听
-(void)didFinishLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{
    NSLog(@"地图加载成功");
}

//加载地图失败事件监听
-(void)didFailLoadingMapWithMapView:(MGSMapView *)mapView strDocPath:(NSString *)strDocPath{
    NSLog(@"地图加载失败");
}

代码说明:loadFromFileAsync接口中传入的是在线地图文档mapx格式文件的完整路径,mapx地图文档需要用户自己在MapGIS桌面平台软件中进行组织,然后拷贝到移动设备中。

2、loadFromDocumentAsync方法

//定义地图视图控件、地图文档对象
@property (weak, nonatomic) IBOutlet MGSMapView *mapView;
@property (nonatomic,strong) MGSDocument *document;

//在线地图文档路径
NSString *onlineMapPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"/MapGIS Mobile 2D Sample/Map/MapShow/OnlineWorldJWVector.mapx"];

//创建地图文档对象
_document=[[MGSDocument alloc] init];

//开辟线程,GCD方式创建线程(串行、异步)
//以loadfromdocumentaync方式加载在线矢量地图文档,需要在子线程中执行open方法,请求在线数据
dispatch_queue_t queue=dispatch_queue_create("mapshow", NULL);
dispatch_async(queue, ^{
    //打开地图文档
    long a=[_document open:onlineMapPath];
    if (a>0) {
        // 回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //异步方式加载地图
            [_mapView loadFromDocumentAsync:_document andIndex:0 callback:^(BOOL success) {
                if (success) {
                    //地图加载成功
                } else {
                    //地图加载失败
                }
            }];
        });
    }
});

显示效果如下所示:

在线矢量地图显示效果.jpg 0302在线瓦片地图显示效果.jpg 0303在线WMTS地图显示效果.jpg